package tpf.designer.pattern.course10.producer_consumer.sample1;

/**
 * 篮子是有容量的，因此篮子类需要有一个变量表示容量；篮子至少还有取和装馒头这两个功能
 */
public class SyncStack {
    int index = 0;

    ManTou[] manTousArr = new ManTou[4];  //假设篮子只能装4个馒头

    /**
     * 装馒头
     * @param manTou
     */
    public synchronized void push(ManTou manTou) {
        while (index == manTousArr.length) {    //篮子慢了
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify();  //如果取馒头的wait了，则通知他醒来
        manTousArr[index] = manTou;
        index ++;
    }

    /**
     * 取馒头
     * @return
     */
    public synchronized ManTou pop() {
        while (index == 0) {    //篮子空了
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify();  //如果产馒头的wait了，则通知他醒来
        index --;

        return manTousArr[index];
    }

}
